iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0

今天我們提到 pure function,那相對的也會有, not a pure function, 以下
我們先來的, not a pure function 的實例吧。

Not a pure function

什麼是 pure function,

譬如我們今天去文具店想買筆和筆記本,

一支筆 20 元,一本筆記本 40 元。

想計算總共花了多少錢 ?

let pen = 20;
let notebook = 40;

const totalPrice = () => {
	return pen + notebook;
}

totalPrice(); // 60;

如果今天突然你在購買的途中,老闆突然改了筆的定價為 30 元

那接下來你就會計算出 70 元的價格,如果你有很多狀態都在外部,

這時候你就會因為 pen 和 notebook 的變數是 mutable,就會產生超過 side effect,

你根本不知道哪邊 code 被改了,造成 totalPrice 的結果跟原本不一致。

這是就是 not a pure function 的壞處。

let pen = 20;
let notebook = 40;

const totalPrice = () => {
	return pen + notebook;
}

totalPrice(); // 60;

**pen = 30;**

totalPrice();// 70

Pure function

那什麼是 pure function

Pure function 意指相同的輸入,永遠會得到相同的輸出,而且沒有任何顯著的 side effect。

那什麼是 side effect ?

副作用可以包含,但不限於:

- 更改檔案系統
- 在資料庫寫入紀錄
- 發送一個 http 請求
- 可變資料
- 印出至畫面 / log
- 取得使用者輸入
- DOM 查詢
- 存取系統狀態

所以我們要理解 pure function 就是只要是相同的 input 執行有相同的 output,

然後 input to output 可以是 一 對 一,也可以是多對一,如下圖。

假設是相同的 input 每次顯示結果 (output) 不一樣,就不是 pure function 了。

https://ithelp.ithome.com.tw/upload/images/20211003/2010730737WRBMGsfy.png

圖片出處: https://www.cuemath.com/algebra/one-to-one-function/

所以我們可以來看看哪些是 pure function

- map
const plusOne = [1,2,3,4].map(i=>i+1); // [2,3,4,5]

- reduce
const total = [1,2,3,4].reduce((total,target)=>total+target,0); // 10

以上的 function 就是只要相同 input 就永遠是相同 output

那第一個範例怎麼改寫呢?

let pen = 20;
let notebook = 40;

const totalPrice = (x,y) => {
	return x + y;
}

totalPrice(pen,notebook); // 60;

**pen = 30;**

totalPrice(pen,notebook);// 70

其實只要把 pen, notebook 的參數固定是從 function 的參數傳入,

這樣不管傳入得數值為何,他的功能就是加總而已,在發生問題時,

就可以知道可能是 pen, notebook 的參數問題,讓 function 功能單純化。


上一篇
day17:First-class function
下一篇
day19: High order function
系列文
寫出好維護又簡潔的 react 程式碼 feat: Function Programming30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言